package com.example.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static org.apache.ibatis.ognl.OgnlOps.convertValue;

/**
 * JSON工具类
 * @author Slience
 * @date 2025/7/24 10:57
 **/
public class JsonUtil {

    /**
     * 判断字符串是否为有效的JSON对象
     */
    public static boolean isJsonObject(String text) {
        if (StringUtil.isEmpty(text)) {
            return false;
        }
        try {
            JSON.parseObject(text);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断字符串是否为有效的JSON数组
     */
    public static boolean isJsonArray(String text) {
        if (StringUtil.isEmpty(text)) {
            return false;
        }
        try {
            JSON.parseArray(text);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断字符串是否为有效的JSON（对象或数组）
     */
    public static boolean isJson(String text) {
        return isJsonObject(text) || isJsonArray(text);
    }

    public static boolean isNotJson(String text){
        return !isJson(text);
    }

    /**
     * 将JSON字符串转换为Map
     */
    public static Map<String, Object> jsonToMap(String jsonString) {
        if (StringUtil.isBlank(jsonString)) {
            return new HashMap<>();
        }

        try {
            JSONObject jsonObject = JSON.parseObject(jsonString);
            return jsonObjectToMap(jsonObject);
        } catch (Exception e) {
            throw new RuntimeException("JSON解析失败: " + e.getMessage(), e);
        }
    }

    /**
     * 将JSONObject转换为Map
     */
    public static Map<String, Object> jsonObjectToMap(JSONObject jsonObject) {
        if (jsonObject == null) {
            return new HashMap<>();
        }

        Map<String, Object> resultMap = new HashMap<>();
        Set<Map.Entry<String, Object>> entrySet = jsonObject.entrySet();

        for (Map.Entry<String, Object> entry : entrySet) {
            resultMap.put(entry.getKey(), convertValue(entry.getValue(), Object.class));
        }

        return resultMap;
    }
}
